--[[--------
XWLUA模块：顺序锁


顺序锁是对自旋锁改良后的锁。主要是对读和写的情况进行区分。


## 临界区

顺序锁中包含一个自旋锁和一个顺序值。顺序锁将临界区分为三种：

### 独占写

任何对顺序锁临界区的 **写** 操作都是独占的，每次 **写** 操作时，会先上锁自旋锁，
然后增加顺序值，离开临界区时也会再次增加顺序值。言外之意，顺序值增加两次，顺序值增加的次数是 **偶数** 。

### 非独占读

如果多个CPU进行的是 **只读** 操作，它们可以同时进入 **非独占读临界区** 。
CPU进入非独占读临界区无需获得自旋锁，但需要先测试顺序值是否为 **偶数** ，并记录此时的顺序值。
当退出读临界区时，需要再次读取顺序值，并与之前记录的值进行比较：

+ 如果相等，表示读的结果有效；
+ 如果不相等，则表示读的过程中别的CPU进行了写操作，此次的读操作无效。

### 独占读

如果希望读临界区不会被写操作无效掉，可以使用独占读的方式，
独占读会排斥其他CPU上的独占写和独占读操作，但不会排斥非独占读，
其他CPU依然可以进入非独占读临界区。


## **to-be-closed** 特性

**to-be-closed** 特性是 **Lua-5.4** 新引入的特性。拥有 **to-be-closed** 特性的变量，在离开其作用域时，会自动被 **关闭** 。
**关闭** 的行为是由元方法 **__close()** 来定义的。


XWLUA的顺序锁对象强指针具有 **to-be-closed** 特性，提供了 **Scope Lock** 模式 。
当顺序锁对象强指针离开作用域时，会自动解锁关联的顺序锁。


## 不可重入锁

XWLUA的顺序锁的独占写方式和独占读方式是 **不可重入** 锁，不可重复上锁。

@module xwos.lock.sqlk
]]

--[[--------
新建一个顺序锁

@treturn userdata 新的顺序锁对象的强指针 `sqlksp`

@usage
mysqlk = xwos.sqlk.new()
]]
function new()
end
